<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
//        一旦创建一个函数 就是在当前作用域中创建了一个同名变量。并且将函数代码保存到堆区。栈区中变量名称存储的是堆区的地址
//  // 1、函数的本质 当前作用域下存在fn变量 值是0x111
// function fn(){
//     console.log('fn')
// }
// //将栈区的值找到得到一个内存地址 内存地址对应的是一个函数 所以()可以调用
// fn()

//       // 2、函数传递参数
// function fn(a,b){
//     // 形参赋值  就好比 执行 let a = aa ;let b = bb;
//     console.log(a,b)
// }

// let aa = 10;//栈区有一个空间存储的是10
// let bb = [1,2,3]//栈区有一个存储空间 存储的是地址 地址对应在堆区中存储的数据(0X222)
// fn(aa,bb);

// function fn(a){
//     console.log(a)
//     a()
// }
// function cb(){
//     console.log('回调函数')
// }
// fn(cb)

// 使用匿名函数做回调
// 使用匿名作为回调
// 将函数的地址赋值给cb变量 所以每次创建函数就得到一个内存地址 注意不是return
// let cb = function(){

// }
// function fn(a){
//     // let a = 0X111
//     a();
// }
// // function(){console.log(回调)}  得到的就是一个内存地址 例如0X111
// // fn(0X111)
// fn(function(){
//     console.log('回调  匿名函数创建就得到的一个内存地址')
// })

// 调用回调并且传递参数
function fn(cb){
            // 调用函数 传递的是实参
            let options = {total:100,pageSize:10};
            // 传递的options 是一个内存地址
            cb(options) 
        }
        // op变量是形参
        // let op = options
        fn(function(op){
            console.log('op变量的值就是传递过来的option')
            console.log(op)
        })
    </script>
</body>
</html>